/* 
    1.promise 是一个类，在执行这个类的时候 需要传递一个执行器进去 执行器会立即执行
    2.promise中有三种状态 分别为 成功fulfilled  失败rejected 等待pending
        pending --> fulfilled
        pending --> rejected 
        一旦状态确定就不可更改 （resolve 和reject就是改变这个状态的 ）
    3.resolve 和reject 函数用来更改状态
        resolve ：fulfilled 
        reject : rejected
    4.then 内部要做的事情就是判断状态，就是判断promise状态是成功就调用成功回调函数，是失败就调用失败回调函数 then 方法是被定义在原型对象中的
    5.then 成功回调有一个参数表示成功之后的值， then失败回调有一个参数表示失败之后的原因
    6.同一个promise对象下的then方法是可以被调用多次的
    7.then方法是可以链式调用的，后面的then方法的回调函数拿到的值是上一个then方法的回调函数的返回值
    8.all 解决异步并发问题的，允许我们按照异步调用的顺序得到异步代码执行的结果

    9.promise.resolve返回一个成功的promise对象,如果是普通值 就创建一个promise对象把给定值包裹到其中并返回是promise对象就原封不动的返回出去

*/
const MyPromise = require('./myPromise')

let promise = new MyPromise((resolve, reject)=> {
    
    // resolve("成功")
    // reject("失败")
    // setTimeout(()=> {  //在promise加入异步逻辑
    //     resolve("成功-----")
    // },2000)
})
// promise.then(value=>{
//     console.log(1)
//     console.log(value)
// }, reason=> {
//     console.log(reason)
// })
// promise.then(value=>{
//     console.log(2)
//     console.log(value)
// }, reason=> {
//     console.log(reason)
// })
// 多次调用then方法的时候，同步是正确的 有成功的状态就执行then里的success
//如果是异步，要把所有的then方法 存起来，等状态改变在执行

// promise.then(value=> {
    // console.log(value)
    // return 100;
    // return other()
// }).then(value => {    //示例then的链式调用   //1.如何实现then方法的链试调用。2，如何把上一个then方法的回调返回值传递给下一个then方法
//     console.log(value)
// }) 
// 处理在then中返回promise 对象
function other() {
    return new MyPromise((resolve, reject)=> {
        resolve('other')
    })
}

// let p1 = promise.then(value=> {
//     console.log(value);
//     return 'aaaa';
// },reason=> {
//     console.log(reason);
//     return 1000;
// }).then(value=> {
//     console.log(value);
// },reason=> {
//     console.log(reason.message);

// })

// promise.then().then().then(value=> console.log(value),reason=> console.log(reason))
// all
function p1() {
    return new MyPromise(function(resolve, reject) {
        setTimeout(function() {
            resolve('p1')
        },2000)
    })
}
function p2() {
    return new MyPromise(function(resolve, reject) {
        // resolve('p2')
        reject('p2 reject')
    })
}
// all
// MyPromise.all(['a','b',p1(),p2(),'c']).then(result => console.log(result,"===="))

// resolve()
// MyPromise.resolve(100).then(value => console.log(value))
// MyPromise.resolve(p1()).then(value => console.log(value))

// filally
// p2().finally(()=> {
//     console.log('finally')
//     return p1();
// }).then(value => {
//     console.log(value)
// }, reason=> {
//     console.log(reason)
// })

// catch 处理当前函数的失败方法
p2().then(value=> console.log(value))
    .catch(reason => console.log(reason))


